package actions.admin;

import java.io.Serializable;
import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Factory;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;

import domain.Categoria;

@Name("categoryBean")
@Scope(ScopeType.SESSION)
@SuppressWarnings("all")
public class CategoryAction implements Serializable {

	@In
	EntityManager em;

	@DataModel
	private List categoriasAdmin;

	@DataModel
	private List categoriasAsignar;

	@DataModelSelection("categoriasAdmin")
	Categoria categoria;

	// Nueva categoria a asignar a los restaurantes cuando se elimina una
	// categoria
	@In(required = false, create = true)
	@Out
	private Categoria nuevaCategoria = new Categoria(0,"","");

	private boolean tieneRestaurantes = false;

	@In(required = false, create = true)
	@Out
	private Categoria categoriaInsertar = new Categoria();

	@In(required = false, create = true)
	@Out
	private Categoria categoriaModificar = new Categoria();

	// Acciones sobre la categoria
	private boolean insertar;// nueva
	private boolean modificar;

	@Factory("categoriasAdmin")
	public List<Categoria> loadCategorias() {

		categoriasAdmin = (List<Categoria>) em.createQuery("From Categoria")
				.getResultList();

		return categoriasAdmin;
	}

	public void deleteCategory() {
		categoria = em.find(Categoria.class, categoria.getCategoria());
		em.remove(categoria);
		categoriasAdmin = null;
	}

	// Comprueba si la categoria tiene restaurantes asignados
	public void compruebaCategoria() {
		this.setTieneRestaurantes(!em.find(Categoria.class,
				categoria.getCategoria()).getRestaurantes().isEmpty());
		categoriasAsignar = null;
	}

	public void iniciarModificar() {
		categoriaModificar.setNombre(categoria.getNombre());
		categoriaModificar.setDescripcion(categoria.getDescripcion());
		this.setInsertar(false);
		this.setModificar(true);
	}

	public void modificarCategoria() {
		categoria = em.find(Categoria.class, categoria.getCategoria());
		categoria.setNombre(categoriaModificar.getNombre());
		categoria.setDescripcion(categoriaModificar.getDescripcion());
		em.persist(categoria);
		this.setModificar(false);
		categoriasAdmin = null;

	}

	public void cancelarModificar() {
		this.setModificar(false);
	}

	public void iniciarInsertar() {
		this.setInsertar(true);
	}

	public void insertarCategoria() {
		this.setInsertar(false);
		em.persist(categoriaInsertar);
		categoriasAdmin = null;

	}

	public void cancelarInsertar() {
		this.setInsertar(false);
	}

	// Categoria a asignar en caso de que se desee eliminar una categoria con
	// restaurantes
	@Factory("categoriasAsignar")
	public List<Categoria> categoriasAsignar() {
		if (categoria != null)
			categoriasAsignar = (List<Categoria>) em.createQuery(
					"From Categoria ca where ca.categoria <>?").setParameter(1,
					categoria.getCategoria()).getResultList();

		return categoriasAsignar;
	}

	public void actualizarRestaurantes() {
		Categoria seleCategoria = (Categoria) em
				.createQuery(
						"FROM Categoria c join fetch c.restaurantes WHERE c.categoria=?")
				.setParameter(1, categoria.getCategoria()).getSingleResult();
		
		String hola = "hola";
		// for (Iterator it = seleCategoria.getRestaurantes().iterator(); it
		// .hasNext();) {
		// Restaurante r = (Restaurante) it.next();
		// r.setCategoria(nuevaCategoria);
		// em.persist(r);
		// }
		// em.remove(seleCategoria);
		// TODO Revisar nuevaCategoria que no la recibe bien DATAMODEL
		// SELECTION... SELECT ITEMS... ??
		categoriasAdmin = null;
	}

	public boolean tieneRestaurantes() {
		return this.isTieneRestaurantes();
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Categoria getNuevaCategoria() {
		return nuevaCategoria;
	}

	public void setNuevaCategoria(Categoria nuevaCategoria) {
		this.nuevaCategoria = nuevaCategoria;
	}

	public boolean isTieneRestaurantes() {
		return tieneRestaurantes;
	}

	public void setTieneRestaurantes(boolean tieneRestaurantes) {
		this.tieneRestaurantes = tieneRestaurantes;
	}

	public boolean isInsertar() {
		return insertar;
	}

	public void setInsertar(boolean insertar) {
		this.insertar = insertar;
	}

	public boolean isModificar() {
		return modificar;
	}

	public void setModificar(boolean modificar) {
		this.modificar = modificar;
	}

	public Categoria getCategoriaInsertar() {
		return categoriaInsertar;
	}

	public void setCategoriaInsertar(Categoria categoriaInsertar) {
		this.categoriaInsertar = categoriaInsertar;
	}

	public Categoria getCategoriaModificar() {
		return categoriaModificar;
	}

	public void setCategoriaModificar(Categoria categoriaModificar) {
		this.categoriaModificar = categoriaModificar;
	}
}
